package com.hdbandit.multi_tenant.interceptor;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.hdbandit.multi_tenant.constants.CustomRequestAttributes;
/**
 * 自定义多租户拦截器,拦截所有的url请求,并从请求中获取租户的唯一标识符
 * 这里通过HandlerMapping;来获取
 * @author Administrator
 *
 */
public class MultitenancyInterceptor extends HandlerInterceptorAdapter {
    
    private static final String TENANT_PATH_VARIABLE = "tenantId";

    /**
     * 	 HandlerMapping的使用主要分为两步：注册和查找。
     *   注册是根据配置文件中的配置将一个字符串和一个Controller类以<key,value>的形式存入到Map中，这个key就是对应的url中的某个字段。
     *   查找就是HandlerMapping根据url中的的某个字段，在Map中以这个字段为key值对应的Controller类，并将Controller类封装成一个HandlerExecutionChain对象，
     *   HandlerExecutionChain中除了有Controller对象外，还有一组拦截器。
     *   
     *   换句话说,就是通过此拦截器拿到所有包含了类路径的controller,也就是/{xxxx}/aaaa这一类路径
     *   并且一Map<key,value>的形式,即是<tenantId,xxxxx>将类路径变量以及对应的值存如Map集合中
     *   然后我们根据这里类路径xxx就可以获取当前租户是属于哪一个租户,并且将其保存在request中,以供后面的使用
     *   
     */
    @SuppressWarnings("unchecked")
    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
    	
         Map<String, Object> pathVars = (Map<String, Object>) req.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
         
         if (pathVars.containsKey(TENANT_PATH_VARIABLE)) {
             req.setAttribute(CustomRequestAttributes.CURRENT_TENANT_IDENTIFIER, pathVars.get(TENANT_PATH_VARIABLE));
         }
         
         return true;
    }

}
